﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;

namespace VerficationsWPF.Verifications
{
    /// <summary>
    /// AsyncTasRunWindow.xaml 的交互逻辑
    /// </summary>
    public partial class AsyncTasRunWindow : Window
    {
        public Task? ResultTask;
        TaskFactory taskFactory = new TaskFactory();

        public AsyncTasRunWindow()
        {
            InitializeComponent();
        }

        //public void RunAndShow<TResult>(Action action)
        //{
        //    ResultTask = taskFactory.StartNew(action);
        //    if (Visibility != Visibility.Visible)
        //        this.ShowDialog();
        //}


        // 重要的演示函数，展示了如何使用多线程监听另一线程，并对界面进行修改，而且方法非常简单
        public void RunAndShow<TResult>(Func<TResult> func)
        {
            btnSimpleTest.IsEnabled = false;
            // 以多线程启动 func，同时返回线程对象 
            ResultTask = taskFactory.StartNew(func);

            // 再启动一个线程，对ResultTask进行等待，如果完成，则显示相关信息
            taskFactory.StartNew(() =>
            {
                // 等待 ResultTask完成
                ResultTask.Wait();

                // 在tbInfo线程上更新其文本内容
                tbInfo.Dispatcher.Invoke(() =>
                {
                    tbInfo.Text = "任务处理完成。";
                    // 相同线程的对象可以一并处理
                    btnSimpleTest.IsEnabled = true;
                });
                Thread.Sleep(3000);

                // 在主窗体线程上关闭窗体
                this.Dispatcher.Invoke(() => this.Close());
            });
            if (Visibility != Visibility.Visible)
                this.ShowDialog();
        }

        private void btnSimpleTest_Click(object sender, RoutedEventArgs e)
        {
            Common.print("btnSimpleTest Clicked");
        }
    }
}
